﻿using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace USU.MetricsMonitor.Storage
{
    public class BinaryStorage : IStorage
    {
        private const string FILE_EXT = "dat";

        public string DefaultFileExtension
        {
            get { return FILE_EXT; }
        }
        /// <summary>
        /// Сохраняет объект в хранилище
        /// </summary>
        public void Save<T>( string filePath, T obj )
        {
            try
            {
                using ( var fs = File.Open( filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None ) )
                {
                    var binaryFormatter = new BinaryFormatter();
                    binaryFormatter.Serialize( fs, obj );
                }
            }
            catch ( SerializationException ex )
            {
                throw new StorageException( "Ошибка при сериализации объекта.", ex );
            }
            catch ( Exception ex )
            {
                throw new StorageException( "Ошибка при сохранении объекта.", ex );
            }
        }

        /// <summary>
        /// Загружает объект из хранилища
        /// </summary>
        public T Load<T>( string filePath )
        {
            try
            {
                using ( var fs = File.OpenRead( filePath ) )
                {
                    var binaryFormatter = new BinaryFormatter();
                    return (T)binaryFormatter.Deserialize( fs );
                }
            }
            catch ( SerializationException ex )
            {
                throw new StorageException( "Ошибка при десериализации объекта.", ex );
            }
            catch ( Exception ex )
            {
                throw new StorageException( "Не удалось получить объект из хранилища.", ex );
            }
        }

        public bool Exists( string filePath )
        {
            return File.Exists( filePath );
        }
    }
}